]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/app: Warn instead of crashing if disposed before startup notification
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Thu, 29 Aug 2024 07:19:14 +0000 (15:19 +0800)
committerSimon McVittie <smcv@debian.org>
Mon, 3 Aug 2026 09:52:09 +0000 (10:52 +0100)
This is currently easy to reproduce by launching and immediately closing
Chrome, then closing the shell. But automated crash reports show it can
also happen while using the shell, during a garbage collection run.

It's currently the top gnome-shell crasher in Ubuntu, and mostly with
Chromium/Electron apps. But regardless of the offender, we shouldn't
ever trust application behaviour to keep the shell alive.

Bug: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7045
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2037055
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3457

Gbp-Pq: Name shell-app-Warn-instead-of-crashing-if-disposed-before-sta.patch

src/shell-app.c

index 5864a6c8ae75450afae88fa439ea2717fb905b36..9ace95f65f8404b40cfa895517724c87f8f51c6b 100644 (file)
@@ -1766,14 +1766,32 @@ shell_app_dispose (GObject *object)
 {
   ShellApp *app = SHELL_APP (object);
 
-  g_clear_object (&app->info);
   g_clear_object (&app->fallback_icon);
 
   while (app->running_state)
     _shell_app_remove_window (app, app->running_state->windows->data);
 
-  /* We should have been transitioned when we removed all of our windows */
-  g_assert (app->state == SHELL_APP_STATE_STOPPED);
+  if (app->state != SHELL_APP_STATE_STOPPED && app->info)
+    {
+      const char *name = g_desktop_app_info_get_generic_name (app->info);
+      const char *file_name = g_desktop_app_info_get_filename (app->info);
+
+      if (!name)
+        name = "(name unknown)";
+
+      if (!file_name)
+        file_name = "(filename unknown)";
+
+      g_warning ("App \"%s\" (%s) claims to still be %s when being disposed. "
+                 "Please ask the app developer to check if StartupNotify=true "
+                 "in the .desktop file is properly implemented.",
+                 name,
+                 file_name,
+                 app->state == SHELL_APP_STATE_STARTING ? "starting" :
+                                                          "running");
+    }
+
+  g_clear_object (&app->info);
   g_assert (app->running_state == NULL);
 
   G_OBJECT_CLASS(shell_app_parent_class)->dispose (object);